package com.dlc.shop.user.common.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dlc.shop.bean.model.UserExtension;
import com.dlc.shop.user.common.dto.LevelDetailDto;
import com.dlc.shop.user.common.dto.UserLevelDto;
import com.dlc.shop.user.common.model.UserLevel;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Set;

/**
 * 会员等级
 *
 * @author LGH
 * @date 2020-02-26 16:03:14
 */
public interface UserLevelMapper extends BaseMapper<UserLevel> {

    /**
     * 获取用户所在等级的，等级及等级关联的分类id列表信息
     * @param user 用户信息
     * @param shopId 店铺id
     * @return 等级及等级关联的分类id列表
     */
    UserLevel selectOneAndCategory(@Param("user") UserExtension user, @Param("shopId") Long shopId);

    /**
     * 批量获取用户关联的店铺会员信息
     * @param userId
     * @param shopIds
     * @return
     */
    List<UserLevel> listLevelAndCategoryByUserId(@Param("userId") String userId, @Param("shopIds") Set<Long> shopIds);

    /**
     * 获取店铺的会员等级列表
     * @param levelType
     * @param shopId
     * @return
     */
    List<UserLevel> listLevelAndCategoryByShopId(@Param("shopId") Long shopId,
                                                 @Param("levelType") Integer levelType);

    /**
     * 根据等级类型，获取对应的等级列表
     * @param userLevelType 等级类型
     * @param shopId 店铺id
     * @return 等级列表
     */
    List<UserLevelDto> getList(@Param("userLevelType") Integer userLevelType,
                               @Param("shopId") Long shopId);

    /**
     * 获取等级列表， 等级包含等级关联的分类id列表 （普通会员等级）
     * @param nowGrowth 所需成长值
     * @param shopId 店铺id
     * @param level 等级
     * @return  等级列表
     */
    List<UserLevel> selectListAndCoupons(@Param("nowGrowth") Integer nowGrowth,
                                         @Param("shopId") Long shopId,
                                         @Param("level") Integer level);

    /**
     * 获取等级列表， 等级包含等级关联的分类id列表 （付费会员等级）
     * @param level 等级
     * @param levelType 等级类型
     * @param shopId 店铺id
     * @return  等级列表
     */
    List<UserLevel> selectLevelAndCoupons(@Param("level") Integer level, @Param("levelType") Integer levelType, @Param("shopId") Long shopId);

    /**
     * 获取等级列表， 等级包含等级关联的分类id列表 （付费会员等级）
     * @param level 等级
     * @param levelType 等级类型
     * @param shopId 店铺id
     * @return  等级列表
     */
    UserLevel selectLevel(@Param("level") Integer level, @Param("levelType") Integer levelType, @Param("shopId") Long shopId);

    /**
     * 获取等级列表，等级包含等级关联的权限列表信息
     * @param levelType 等级类型
     * @param shopId 店铺id
     * @return 等级列表
     */
    List<LevelDetailDto> selectLevelAndRights(@Param("levelType") Integer levelType,
                                              @Param("shopId") Long shopId);

    /**
     * 更新普通会员等级的状态为启用
     *
     * @param platformShopId
     */
    void setStatusByLevelType(@Param("platformShopId") Long platformShopId);

    /**
     * 获取等级列表， 等级包含等级关联的分类id列表 （普通会员等级）（等级倒序）
     *
     * @param nowGrowth 所需成长值
     * @param level     等级
     * @param shopId
     * @return 等级列表
     */
    List<UserLevel> selectListAndCouponsLtNowGrowth(@Param("nowGrowth") Integer nowGrowth, @Param("level") Integer level, @Param("shopId") Long shopId);


    /**
     * 根据等级获取等级信息包含国际化信息
     * @param levelList
     * @param levelType
     * @return
     */
    List<UserLevelDto> getUserLevelLangList(@Param("levelList") List<Integer> levelList, @Param("levelType") Integer levelType);

    /**
     * 获取正常状态的等级id列表
     * @param userLevelIds
     * @param shopId
     * @return
     */
    List<UserLevel> listUserLevelIds(@Param("userLevelIds") List<Long> userLevelIds, @Param("shopId") Long shopId);
}
